package org.vacoor.nothing.common.reflect;

import java.util.Date;

/**
 */
public abstract class ObjectSwitch<T> {

    public final T doSwitch(Object o) {
        if (o instanceof Boolean) {
            return caseBoolean((Boolean) o);
        }
        if (o instanceof Byte) {
            return caseByte((Byte) o);
        }
        if (o instanceof Character) {
            return caseCharacter((Character) o);
        }
        if (o instanceof Short) {
            return caseShort((Short) o);
        }
        if (o instanceof Integer) {
            return caseInteger((Integer) o);
        }
        if (o instanceof Long) {
            return caseLong((Long) o);
        }
        if (o instanceof Float) {
            return caseFloat((Float) o);
        }
        if (o instanceof Double) {
            return caseDouble((Double) o);
        }
        if (o instanceof String) {
            return caseString((String) o);
        }
        if (o instanceof Date) {
            return caseDate((Date) o);
        }

        return defaultCase(o);
    }

    protected T caseBoolean(Boolean b) {
        return defaultCase(b);
    }

    protected T caseByte(Byte b) {
        return defaultCase(b);
    }

    protected T caseCharacter(Character c) {
        return defaultCase(c);
    }

    protected T caseShort(Short s) {
        return defaultCase(s);
    }

    protected T caseInteger(Integer i) {
        return defaultCase(i);
    }

    protected T caseLong(Long l) {
        return defaultCase(l);
    }

    protected T caseFloat(Float f) {
        return defaultCase(f);
    }

    protected T caseDouble(Double d) {
        return defaultCase(d);
    }

    protected T caseString(String s) {
        return defaultCase(s);
    }

    protected T caseDate(Date d) {
        return defaultCase(d);
    }

    protected T defaultCase(Object o) {
        return null;
    }

    public static void main(String[] args) {
    }
}
